package com.yunhe.energy.service.data;

import com.yunhe.common.constant.EnergyConsts;
import com.yunhe.common.exception.ArgumentErrorException;
import com.yunhe.common.exception.UniqueConstraintsException;
import com.yunhe.energy.model.CompanySort;
import com.yunhe.common.model.PageParam;
import com.yunhe.energy.domain.data.ElectricityDay;
import com.yunhe.energy.domain.data.ElectricityDetail;
import com.yunhe.energy.domain.data.ElectricityMonth;
import com.yunhe.common.exception.ObjectNotFoundException;

import java.util.Date;
import java.util.List;

/**
 * 电量Service
 * @author liuronglei
 * @desc 电量服务类实现
 */
public interface ElectricityService {


    /**
     * 新增电量对象（日）
     * @param electricity 电量对象
     */
    ElectricityDay createElectricityDay(ElectricityDay electricity)
            throws ArgumentErrorException, UniqueConstraintsException;

    /**
     * 新增电量对象（月）
     * @param electricity 电量对象
     */
    ElectricityMonth createElectricityMonth(ElectricityMonth electricity)
            throws ArgumentErrorException, UniqueConstraintsException;

    /**
     * 批量新增电量对象（日）
     * @param electricityList 电量对象列表
     */
    Iterable<ElectricityDay> createElectricityDay(List<ElectricityDay> electricityList)
            throws ArgumentErrorException, UniqueConstraintsException;

    /**
     * 批量新增电量对象（月）
     * @param electricityList 电量对象列表
     */
    Iterable<ElectricityMonth> createElectricityMonth(List<ElectricityMonth> electricityList)
            throws ArgumentErrorException, UniqueConstraintsException;

    /**
     * 根据条件获得电量对象列表（明细）
     * @param deviceId 对象ID
     * @param dtime 时间范围
     * @param pageParam 分页对象
     */
    Iterable<ElectricityDetail> findElectricityDetail(Long deviceId,
                                                      List<Date> dtime,
                                                      PageParam pageParam)
            throws ObjectNotFoundException;

    /**
     * 根据条件获得电量对象列表（日）
     * @param deviceId 对象ID
     * @param dtime 时间范围
     * @param pageParam 分页对象
     */
    Iterable<ElectricityDay> findElectricityDay(Long deviceId,
                                                List<Date> dtime,
                                                PageParam pageParam)
            throws ObjectNotFoundException;

    /**
     * 根据条件获得电量对象列表（月）
     * @param firmId 单位ID
     * @param dtime 时间范围
     * @param pageParam 分页对象
     */
    Iterable<ElectricityMonth> findElectricityMonth(Long firmId,
                                                    List<Date> dtime,
                                                    PageParam pageParam)
            throws ObjectNotFoundException;

    /**
     * 获得对象当日电量
     * @param deviceId 设备ID
     * @param pointDataType 点号类型
     */
    Double getLastDetail(Long deviceId, String pointDataType) throws ObjectNotFoundException;

    /**
     * 获得时间段的电量总和
     * @param deviceId 设备ID
     * @param dtime 日期
     * @param type 电量类型
     */
    Double getDayCount(Long deviceId,
                       List<Date> dtime,
                       EnergyConsts.ELECTRICITY_TYPE type) throws ObjectNotFoundException;

    /**
     * 获得企业能耗排名（月）
     * @param firmId 单位ID
     * @param stationId 电站ID
     * @param dtime 日期
     */
    List<CompanySort> getCompanyMonthSort(Long firmId,
                                          Long stationId,
                                          Date dtime,
                                          PageParam pageParam);

}